Анализ и визуализация данных
Интерполяция данных
Работа с библиотекой Impute.jl
Еще один способ заполнения пропусков в таблице DataFrame — использование кусочно-линейной интерполяции, то есть оценка значений на основе значений соседних точек. В Julia для этого удобно использовать библиотеку Impute.jl.
Рассмотрим пример. Сначала подключим необходимые библиотеки:
using Impute, DataFrames
Создадим таблицу DaraFrame, содержащую три столбца с пропущенными данными:
x = DataFrame(a=[1, missing, 3, 4, 5], b=[3, 4, missing, 6, 7], c=[5, 6, 7, 8, missing])
Для оценки пропущенных значений используем функцию interp из этой библиотеки:
Impute.interp(x)
В общем случае некорректно продлевать оценку при помощи линейной интерполяции за пределы последовательности. Поэтому если по краям последовательности располагаются значения missing, то функция interp оставит эти пропущенные значения без изменений.
Вот небольшой перечень функций из библиотеки Impute:
nocb— подстановка значения последней непустой ячейки, встреченной при обратном проходе по массиву;locf— подстановка значения последней непустой ячейки, встреченной при прямом проходе по массиву;knn— подстановка в пропущенную ячейку значения ближайшей соседней непустой ячейки;interp— линейная интерполяция между двумя значениями, которые ближе всего находятся к серии пропущенных ячеек;svd— подстановка значения путем разложения всей матрицы на SVD компоненты.srs— подстановка случайного значения из списка значения непустых ячеек вектора;fill— подстановка заданного постоянного значения.
Выбор конкретного метода зависит от предположений, которые вы можете выдвинуть в отношении данных и причин отсутствия значений (совершенно случайное, коррелированное с имеющимися данными, в том числе в других столбцах).
Примечание
Функции интерполяции из библиотеки Impute.jl предназначены для работы с данными, равномерно расположенными по оси абсцисс.
Информацию об аргументах этих функций предлагаем почерпнуть из документации библиотеки Interp.jl и на странице с кратким описанием этой библиотеки.
✏️Задание 1
Для таблицы DataFrame, заданной в предыдущем примере, выполните подстановку значений последней непустой ячейки, встреченной:
- При прямом проходе по массиву (с помощью функции
Impute.locf); - При обратном проходе по массиву (с помощью функции
Impute.nocb).
Решение
Impute.locf(x)
Impute.nocb(x)
Использование библиотеки Interpolations.jl
Линейная интерполяция
Библиотека Interpolations.jl реализует различные интерполяционные схемы на языке Julia. Она поддерживает B-сплайны и нерегулярные сетки.
Пример. Подключим библиотеку Interpolations.jl:
using Interpolations
Создадим сетку значений x и массив интерполируемых значений :
x = 1:0.2:5
A = log.(x)
Создадим объект линейной интерполяции без экстраполяции:
itp = linear_interpolation(x, A);
Выполним линейную интерполяцию в одном из узлов сетки — в точке x=3:
itp(3)
Теперь выполним линейную интерполяцию в точке x=3.1, не совпадающей с узлами сетки:
itp(3.1)
Создадим объект линейной интерполяции с экстраполяцией:
itp = linear_interpolation(x, A, extrapolation_bc=Line());
Выполним линейную экстраполяцию в точке x=0.9, находящейся вне сетки:
itp(0.9)
✏️Задание 2
Задайте массив значений аргумента t на отрезке от 0 до 10 с шагом 1 и массив значений функции , вычисленных в этих точках. Выполните линейную интерполяцию этой функции в точке t=5.5, а также линейную экстраполяцию в точке t=10.2.
Решение
using Interpolations
t = collect(0:10)
y = sin.(t)
itp = linear_interpolation(t, y) # линейная интерполяция
itp(5.5)
itp = linear_interpolation(t, y, extrapolation_bc=Line()) # линейная экстраполяция
itp(10.2)
Интерполяция B-сплайнами
Тип интерполяции описывается степенью и при необходимости граничными условиями. В библиотеке Interpolations.jl доступны четыре степени: Constant, Linear, Quadratic и Cubic. Они соответствуют B-сплайнам степени 0, 1, 2 и 3.
B-сплайны второй или более высокой степени требуют решения системы уравнений для получения интерполяционных коэффициентов. Для этого необходимо указать граничное условие, применяемое для замыкания системы. Реализованы следующие граничные условия: Flat, Line (либо Natural), Free, Periodic и Reflect. При задании этих граничных условий необходимо также указать, применяются ли они в крайней точке сетки (OnGrid()) или за ней на середине интервала до следующей (мнимой) точки сетки (OnCell()).
Рассмотрим некоторые примеры интерполяции на том же массиве A.
Интерполяция по алгоритму ближайшего соседа:
itp = interpolate(A, BSpline(Constant()))
itp(2.4)
Интерполяция по алгоритму предыдущего соседа:
itp = interpolate(A, BSpline(Constant(Previous)))
itp(3.8)
Интерполяция по алгоритму следующего соседа:
itp = interpolate(A, BSpline(Constant(Next)))
itp(4.1)
(Поли)линейная интерполяция:
itp = interpolate(A, BSpline(Linear()))
itp(4.1)
Квадратичная интерполяция с отражательными граничными условиями:
itp = interpolate(A, BSpline(Quadratic(Reflect(OnCell()))))
itp(1.7)
✏️Задание 3
Для массивов t и y, заданных Задании 2, выполните интерполяцию B-сплайнами степеней 0, 1 и 2 в точке t=2.1.
Решение
itp = interpolate(y, BSpline(Constant()))
itp(2.1)
itp = interpolate(y, BSpline(Linear()))
itp(2.1)
itp = interpolate(y, BSpline(Quadratic(Reflect(OnCell()))))
itp(2.1)
На Julia реализовано и множество других пакетов для интерполяции. Их список смотрите в разделе Документации Другие пакеты для интерполяции.